% coding: utf-8

\subsection{Tercera parte: detecci\'on de versi\'on.}
\indent \textit{La t\'ecnica de banner grabbing consiste, como hemos explicado, en realizar una interacci\'n preestablecida con un servicio en donde \'este env\'ia informaci\'on sobre su implementaci\'on (i.e, n\'umero de versi\'on, sistema operativo, etc.). }

\indent \textit{Documentar al menos tres servicios susceptibles a la t\'ecnica de banner grabbing y dar una implementaci\'on para la captura de dicho banner.}

\begin{itemize}
	\item www

		En este caso, luego de intentar con varios dominios web y que estuvieran protegidos a esta técnica, encontramos un dominio sensible a la misma. Tal dominio fue www.santarosamunro.com.ar, y lo que hicimos fue hacer un pedido a esta url por el recurso ``pepe''. Dado que dicho recurso no existe, y que muestra la página de error 404 default (no una página personalizada), no se omite información. Entonces, cuando nos retorna que el recurso no existe, nos devuelve dicha información en el header sin haberla solicitado. Tal información en este caso es el servidor, el sistema operativo, y la fecha.

\begin{Verbatim}[frame=single, label=C\'odigo, numbers=left]
import urllib

def servicio_www(url="http://www.santarosamunro.com.ar/pepe"):
	opener = urllib.FancyURLopener({})
	f = opener.open(url)
	mensaje = f.info()
	server = mensaje.__getitem__('Server')
	fecha = mensaje.__getitem__('Date')
	print "Server: " + server
	print "Fecha: " + fecha
	return (server, fecha)
\end{Verbatim}

	Dejamos por default como parámetro a la url en cuestión, pero damos la posibilidad de hacer intentos con otras urls, dando flexibilidad a la función.

Resultado:
\begin{center}
\begin{Verbatim}[frame=single, label=Demostraci\'on]
>>> ej3.servicio_www()
Server: Apache/2.2.22 (Unix) mod_ssl/2.2.22 OpenSSL/0.9.8e-fips-rhel5
Fecha: Sat, 23 Jun 2012 21:59:42 GMT
('Apache/2.2.22 (Unix) mod_ssl/2.2.22 OpenSSL/0.9.8e-fips-rhel5', 
'Sat, 23 Jun 2012 21:59:42 GMT')
\end{Verbatim}
\end{center}

	\item ftp

		En este caso, obtenemos con ftp el servidor del dominio y puerto en cuestión. Lo que hacemos en este caso es quedarnos con el proceso y luego de cierto timeout lo finalizamos para no tener que interactuar.

\begin{Verbatim}[frame=single, label=C\'odigo, numbers=left]
import subprocess
import time

def servicio_ftp(dominio="bejerman.com.ar", timeout=10):
	proceso = subprocess.Popen(
		['ftp', dominio, "21"],
		stderr=subprocess.PIPE, stdout=subprocess.PIPE
	)  
	time.sleep(timeout)
	proceso.kill()
	respuesta = proceso.communicate()[0]
	return respuesta
\end{Verbatim}

	Dejamos por default como parámetro a la url en cuestión, pero damos la posibilidad de hacer intentos con otras urls, dando flexibilidad a la función.
	
Resultado:
\begin{center}
\begin{Verbatim}[frame=single, label=Demostraci\'on]
>>> ej3.servicio_ftp()
'Connected to bejerman.com.ar.\n220 ftp.bejerman.com.ar X2 WS_FTP 
Server 5.0.5 (1038694621)\n'
\end{Verbatim}
\end{center}
		
	\item ssh

		En este caso obtenemos el sistema operativo. Lo que hacemos en este caso es quedarnos con el proceso y luego de cierto timeout lo finalizamos para no tener que interactuar.

\begin{Verbatim}[frame=single, label=C\'odigo, numbers=left]
import subprocess
import time

def servicio_ssh(dominio="uberbin.net", timeout=10):
	proceso = subprocess.Popen(
		['nc', dominio, "22"],
		stderr=subprocess.PIPE, stdout=subprocess.PIPE
	)  
	time.sleep(timeout)
	proceso.kill()
	respuesta = proceso.communicate()
	return respuesta
\end{Verbatim}

		Dejamos por default como parámetro a la url en cuestión, pero damos la posibilidad de hacer intentos con otras urls, dando flexibilidad a la función.

Resultado:
\begin{center}
\begin{Verbatim}[frame=single, label=Demostraci\'on]
>>> ej3.servicio_ssh()
('SSH-2.0-OpenSSH_5.5p1 Debian-6+squeeze1\r\n', '')
\end{Verbatim}
\end{center}

\end{itemize}

